﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ServidorGestionClientes
{
    public class Cliente : MarshalByRefObject
    {
        private string nombre;
        private string contrasenia;
        private long saldo;
        private long saldoExtra; //Si cambia de pospago a pre o alrevez descuenta o acredita en esa cuenta hasta quedar en 0
        private bool estaEnFuncionamiento;
        private bool esPosPago;
        private Tuple<int, int> posicionAuto;
        private List<Consumo> listaConsumos;

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        public string Contrasenia
        {
            get { return contrasenia; }
            set { contrasenia = value; }
        }

        public long Saldo
        {
            get { return saldo; }
            set { saldo = value; }
        }

        public long SaldoExtra
        {
            get { return saldoExtra; }
            set { saldoExtra = value; }
        }

        public bool EsPosPago
        {
            get { return esPosPago; }
            set { esPosPago = value; }
        }

        public bool EstaEnFuncionamiento
        {
            get { return estaEnFuncionamiento; }
            set { estaEnFuncionamiento = value; }
        }

        public Tuple<int, int> PosicionAuto
        {
            get { return posicionAuto; }
            set { posicionAuto = value; }
        }

        public Cliente(string nom, string cont, bool esPos)
        {
            saldo = 0;
            listaConsumos = new List<Consumo>();
            nombre = nom;
            contrasenia = cont;
            estaEnFuncionamiento = false;
            esPosPago = esPos;
            ActualizarPosicion(0, 0);
        }

        public void AgregarConsumo(int km, long cons, DateTime fecha)
        {
            Consumo c = new Consumo(km, cons, fecha);
            listaConsumos.Add(c);
        }

        public string TotalConsumido()
        {
            long totalKM = 0;
            long totCons = 0;
            foreach (Consumo c in listaConsumos)
            {
                totalKM += c.KmRecorrido;
                totCons += c.ConsumoPlata;
            }
            return "  Distancia " + totalKM + " km   Consumido $" + totCons;
        }

        public void ActualizarPosicion(int x, int y)
        {
            posicionAuto = new Tuple<int, int>(x, y);
        }

        public void RecargarSaldo(long cantidadARecargar)
        {
            if (esPosPago)
            {
                saldo -= cantidadARecargar;
            }
            else
            {
                saldo += cantidadARecargar;
            }
        }

        public void DescontarSaldo(long cantidadADescontar)
        {
            if (esPosPago)
            {
                if (saldoExtra > 0)
                {
                    if (saldoExtra >= cantidadADescontar)
                    {
                        saldoExtra -= cantidadADescontar;
                    }
                    else
                    {
                        long cantADescontarFinal = cantidadADescontar - saldoExtra;
                        saldo += cantADescontarFinal;
                    }
                }
                else
                {
                    saldo += cantidadADescontar;
                }
            }
            else
            {
                saldo -= cantidadADescontar;
            }
        }

        public List<Consumo> ListaDeConsumos()
        {
            return this.listaConsumos;
        }

        public string InfoConsumos()
        {
            string str = "";
            int cont = 0;
            foreach (Consumo c in listaConsumos)
            {
                if (cont==0){
                    str += c.ToString();
                }
                else {
                    str += "#" + c.ToString();
                }
                cont++;
            }
            return str;
        }

        public override bool Equals(object obj)
        {
            if (obj is Cliente)
            {
                return ((Cliente)obj).Nombre.Equals(nombre);
            }
            return false;
        }

        public override string ToString()
        {
            return nombre;
        }
    }
}
